// 过滤 swagger 路径
const swaggerPathRegexp = /^\/swagger[\w\W]+$/;
module.exports = (options) => {
    // 返回一个中间件
    return async (ctx, next) => {
        // 在白名单中，直接走
        if (
            options.whiteList.includes(ctx.path) ||
            swaggerPathRegexp.test(ctx.path)
        ) {
            await next();
            return;
        }

        // 从请求头中，取出 token
        const token = ctx.headers.token;

        // 如果没有 token 返回，不允许访问
        if (!token) {
            ctx.cast(401, "需要 token 才能调用");
        }

        // 有 token，校验 token 合法性
        try {
            // 解析用户信息
            const user = ctx.helper.checkToken(token);
            // 挂载到 ctx 上，以便处理函数中使用
            ctx.user = user;
        } catch (error) {
            // token 过期
            if (error.name === "TokenExpiredError") {
                ctx.cast(401, "token 已过期");
            }

            // token 被篡改
            if (error.name === "JsonWebTokenError") {
                ctx.cast(401, "token 非法");
            }

            // 其他错误
            ctx.cast(401, "token 解析失败");
        }

        // 校验成功，向下执行
        await next();
    };
};
